package com.opcode.costatablet.ui.dashboard.leftmenu;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.util.ArrayList;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ArrayAdapter;
import android.widget.FrameLayout;
import android.widget.ListView;

import com.opcode.costatablet.R;
import com.opcode.costatablet.ui.dashboard.KitchenFragment;
import com.opcode.costatablet.ui.dialogs.RoundedProgressDialogBase;
import com.opcode.costatablet.ui.splashscreen.KitchenSplashActivity;
import com.opcode.nebulamobil.base.activities.FragmentActivityBase;
import com.opcode.nebulamobil.base.activities.MediaActivityBase;
import com.opcode.nebulamobil.base.components.ImageViewBase;
import com.opcode.nebulamobil.base.components.TextViewBase;
import com.opcode.nebulamobil.base.fragments.FragmentBase;
import com.opcode.nebulamobil.base.fragments.dialogfragments.SettingsDialogFragment;
import com.opcode.nebulamobil.enums.VoiceRecordingSaveType;
import com.opcode.nebulamobil.information.ApplicationInfo;
import com.opcode.nebulamobil.information.dataforms.costadataforms.ConnectionStatus;
import com.opcode.nebulamobil.information.dataforms.costadataforms.PersonalDataForm;
import com.opcode.nebulamobil.information.requests.costarequests.PersonalListReq;
import com.opcode.nebulamobil.information.responses.costaresponses.PersonalListResp;
import com.opcode.nebulamobil.utility.FileProcess;
import com.opcode.nebulamobil.utility.JsonConverter;
import com.opcode.nebulamobil.utility.UniqueIdCreator;


/**
 * 
 * @author Okan ERDOĞAN
 *
 * 10 Eyl 2014
 */
public class KitchenLeftMenuActivity extends MediaActivityBase{

	//Soldaki menünün layoutlarına ait 
	private DrawerLayout nav_drawer_layout;
	private FrameLayout nav_drawer_content_frame;
	private ListView nav_drawer_left_drawer;
		
	//ActionBar'a ait başlıkları yönetmek amacıyla kullanılacaktır.
	private CharSequence mDrawerTitle;
		private CharSequence mTitle;
		
	//Soldan açılan menünün geçişlerini bu eleman yönetecektir.
	private ActionBarDrawerToggle mDrawerToggle;
		
	/*
	 *  Bu değişken sistemde tanımlı bütün personel listesini tutmaktadır.
	 *  Böylece seçili personele mesaj gönderilebilir.
	*/
	private ArrayList<PersonalDataForm> personalDataFormList;
		
	/*
	 * Sunucudan gelen personel listesi bilgisi bu referansın işaret ettiği nesnede tutulacaktır. 
	 */
	private PersonalListResp personalListResp;
	
	private PersonalListAdapter personalListAdapter;
	
	private Handler myHandler=null;
	private Runnable myRunnable=null;

	private boolean recordingStart=false;
	
	private ConnectionStatus status;
		
	
	public static RoundedProgressDialogBase roundedProgressDialogBase;

	
	 @SuppressWarnings("unchecked")
		protected void onCreate(Bundle savedInstanceState) {
			 super.onCreate(savedInstanceState);
			 
			 this.roundedProgressDialogBase=new RoundedProgressDialogBase();
			 
			 this.myHandler = new Handler();
			 
			 //Burada login ekranında sunucudan alınıp sharedpreferences'a yazılan personel listesi elde ediliyor.
			this.createSharedPreferencesManager("sharedpreferences",this);
			String personalDataFormAsJson=(this.readFromSharedPreferences("personalDataFormList", null));	
			
			if(personalDataFormAsJson!=null){
				this.personalListResp=(PersonalListResp) JsonConverter.fromJsonString(personalDataFormAsJson, PersonalListResp.class);
				this.personalDataFormList=personalListResp.getPersonalList();
			}else{
				this.personalDataFormList=new ArrayList<PersonalDataForm>();
			}
			
			
			//Manifest dosyasında bildirilen action bar tam ekran olmadığı için, yazılımsal olarak uygulamanın bu ekranını tam ekran yapıyoruz.
			getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

			//Activity'ye ait xml dosyası ekleniyor.
			this. setContentView(R.layout.kitchen_leftmenu_activity_layout);
			
			
			 this.nav_drawer_layout=(DrawerLayout) this.findViewById(R.id.nav_drawer_layout);
		     
		     // Burada drawer layout açıldığı zaman oluşacak gölgeyi ayarlıyoruz.
			 this.nav_drawer_layout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
		        
			 this.nav_drawer_content_frame=(FrameLayout) this.findViewById(R.id.nav_drawer_content_frame);
		     
			 //Soldan açılan ekranda yer alan listview nesnesidir.
		     this.nav_drawer_left_drawer=(ListView) this.findViewById(R.id.nav_drawer_left_drawer);
		     this.personalListAdapter=new PersonalListAdapter(this,R.layout.personal_list_left_menu_item_layout, personalDataFormList);
		     this.nav_drawer_left_drawer.setAdapter(personalListAdapter);
		     
		     

		     this.nav_drawer_left_drawer.setOnItemLongClickListener(new OnItemLongClickListener() {			
					@Override
					public boolean onItemLongClick(AdapterView<?> parent, View view,int position, long id) {		
					
						playSoundFromAsset("recording_starts.wav");
						 try {
							 Thread.sleep(500);
						 } catch (InterruptedException e) {
							 e.printStackTrace();
						 }
						 
						System.out.println("Alıcı Personel Id'si"+personalDataFormList.get(position));
						startRecording(VoiceRecordingSaveType.RECORD_TO_COSTA_SERVER,personalDataFormList.get(position).getPersonelID(),00000000000001);
						recordingStart = true;
						System.out.println("Basıldı.");

						return false;
					}
				});
			     
			   this.nav_drawer_left_drawer.setOnTouchListener(new OnTouchListener() {

					@Override
					public boolean onTouch(View v, MotionEvent event) {

						if (event.getAction() == MotionEvent.ACTION_UP) {
							if (recordingStart) {
								System.out.println("çekildi.");
								stopRecording(VoiceRecordingSaveType.RECORD_TO_COSTA_SERVER);
								try {
									Thread.sleep(500);
								} catch (InterruptedException e) {
									e.printStackTrace();
								}
								playSoundFromAsset("recording_finishes.wav");
								recordingStart = false;
							}

						}

						return false;
					}});
		    	
		   //ActionBar'ın uygulamaya ait ikonunu gösterdiği alan aktif ediliyor.
		   //Sol üst köşede menü ikonu görüntülemek ve bu ikona basıldığında menüyü açabilmek için bu ayarları yapıyoruz.
		   this.getActionBar().setDisplayHomeAsUpEnabled(true);
		   this.getActionBar().setHomeButtonEnabled(true);
		   Drawable actionBarBackground = getResources().getDrawable( R.drawable.bckgrnd);
		   this.getActionBar().setBackgroundDrawable(actionBarBackground);
		        
		        
		     this.mTitle = mDrawerTitle = getTitle();
		     
		     // ActionBarDrawerToggle nesnesi oluşturuluyor.
		     //Bu nesne navigationdrawer geçişini yönetiyor.
		     this.mDrawerToggle = new ActionBarDrawerToggle(this, nav_drawer_layout,R.drawable.ic_drawer,R.string.drawer_open,R.string.drawer_close) {
		           
		        	/**
		        	 * Drawer kapandığı zaman çalışan metoddur.
		        	 */
		        	public void onDrawerClosed(View view) {
		                getActionBar().setTitle("");
		                invalidateOptionsMenu(); // Bu metod çağrıldığı zaman onPrepareOptionsMenu metodu üst sınıf tarafından çağrılır.
		            }

		        	/**
		        	 * Drawer açıldığı zaman çalışan metoddur.
		        	 */
		            public void onDrawerOpened(View drawerView) {
		                getActionBar().setTitle("");
		                invalidateOptionsMenu(); // Bu metod çağrıldığı zaman onPrepareOptionsMenu metodu üst sınıf tarafından çağrılır.
		            }
		        };
		        
		        
		        //Drawer toggle nesnesini olutşurduktan sonra bunu drawer layouta listener olarak veriyoruz.
		        nav_drawer_layout.setDrawerListener(mDrawerToggle);

		        if (savedInstanceState== null) {
		        	FragmentBase kitchenFragment = new KitchenFragment();
					subFragmentAddToContainer(R.id.nav_drawer_content_frame, kitchenFragment);
		        }
		        
		        myRunnable = new Runnable() {
					public void run() {
						personalListAdapter.notifyDataSetChanged();
					}
				};
		 }
	
	 public void onStart(){
		 super.onStart();    	
	 }
	 
	 public void onResume(){
		 super.onResume();		 
			setDefaultStartActivity(new KitchenSplashActivity());

	 }
	 
		 
 
	 @Override
	    public boolean onCreateOptionsMenu(Menu menu) {
	        MenuInflater inflater = getMenuInflater();
	        inflater.inflate(R.menu.menu, menu);
	        return super.onCreateOptionsMenu(menu);
	    }
	 
	 
	 /**
		 * Bu metod çağrıldığı zaman suncuya bir personel listesi talebi gönderilir.
		 */
		public void createPersonalRequest(){
			((FragmentActivityBase)this).showGeneralDialog(roundedProgressDialogBase, "KITCHEN_LEFT_ACTIVITY_PROGRESS_DIALOG");
			PersonalListReq personalListReq=new PersonalListReq();
			personalListReq.setType("PersonalListReq");
			personalListReq.setRequestId(UniqueIdCreator.createUniqueID());
			
			/**
			 * Burada klasör içerisindeki png resimlerine bakılır.
			 * Png resimleri personellerin ID'leri ile kayıt edilmiştir.
			 * Bu nedenle bu resimlerin isimlerinden personel ID bilgisi elde edilerek sunucuya g�nderilir.
			 */
			ArrayList<Long>hasImagePersonalIdList=new ArrayList<Long>();
					
			File dirFile=new File(Environment.getExternalStorageDirectory()+"//STS//personalImage//");
			
			/**
			 * Burada klasörün var olup olmadığı kontrol ediliyor.Yoksa oluşturuluyor.
			 */
			if(!dirFile.exists()){
				dirFile.mkdirs();
			}
			
			File[] contentList=FileProcess.getContentlist(new File(Environment.getExternalStorageDirectory()+"//STS//personalImage//"));
			for(int i=0;i<contentList.length;i++){
				if(contentList[i].getName().contains(".png")){
					String contentNameWithoutPng=contentList[i].getName().replace(".png", "");
					System.out.println(contentNameWithoutPng);
					hasImagePersonalIdList.add(Long.valueOf(contentNameWithoutPng));
				}
			}
			personalListReq.setHasImagePersonalIdList(hasImagePersonalIdList);		
			ApplicationInfo.getRequestListener().jsonRequestCame(JsonConverter.toJsonString(personalListReq));

		}

	    
	    
	    /**
	     * invalidateOptionsMenu() metodu çağrıldığı zaman üst sınıf tarafından bu metod tetiklenir.
	     */
	    @Override
	    public boolean onPrepareOptionsMenu(Menu menu) {
	    	//Eğer navigation drawer açıksa içerikle ilişkili elemanları gizler.
	        boolean drawerOpen = this.nav_drawer_layout.isDrawerOpen(this.nav_drawer_left_drawer);
	       
	        menu.findItem(R.id.settings).setVisible(!drawerOpen);
	        return super.onPrepareOptionsMenu(menu);
	    }

	    @Override
	    public boolean onOptionsItemSelected(MenuItem item) {
	         //NavigationDrawer'ın açılı kapanmasını yönetir. Menu butonuna basıldığı zaman bu metod tetiklenir.
	        if (mDrawerToggle.onOptionsItemSelected(item)) {
	            return true;
	        }
	     
	        //Burada action bar'da yer alan butonlar yönetilir.
	        switch(item.getItemId()) {
	        
	        /*
	         * Eğer arama butonuna (Büyüteç ikonu) basılmışsa bu case çalışır.
	         */
	        case R.id.settings:
				showGeneralDialog(new SettingsDialogFragment(), "ACTION_BAR_SETTING_DIALOG");
	            return true;
	        /*
	         * Varsayılan olarak ise bu case çalışır.
	         */
	        default:
	            return super.onOptionsItemSelected(item);
	        }
	    }
	 
	 public void onPause(){
		 super.onPause();

	 }
	 
	 
	 /**
	  * 
	  * @author Okan ERDOĞAN
	  *
	  * 4 Eyl 2014
	  */
	 class PersonalListAdapter extends ArrayAdapter<PersonalDataForm>{

			private Context context;
			private int resourceId;
			private ArrayList<PersonalDataForm> arrayList;
			
			public PersonalListAdapter(Context context, int textViewResourceId,ArrayList<PersonalDataForm> objects) {
				super(context, textViewResourceId, objects);
				
				this.context = context;
				this.resourceId = textViewResourceId;
				
				
				this.arrayList = objects;
			}	
			
			@SuppressLint("NewApi")
			public View getView(int position, View convertView, ViewGroup parent) {
				
				convertView = LayoutInflater.from(this.context).inflate(this.resourceId, null);
				
				PersonalDataForm personalDataForm = (PersonalDataForm) arrayList.get(position);
				TextViewBase personalName=(TextViewBase) convertView.findViewById(R.id.personal_name);
				TextViewBase personalSurname=(TextViewBase) convertView.findViewById(R.id.personal_surname);
				
				ImageViewBase personalImage=(ImageViewBase) convertView.findViewById(R.id.personal_image);

				personalName.setText(personalDataForm.getPersonalName());
				personalSurname.setText(personalDataForm.getPersonelSurName());
				
				if(convert(personalDataForm.getPersonelImage())!=null){
					personalImage.setBackground(convert(personalDataForm.getPersonelImage()));
				}else{
					FileProcess fileProcess=new FileProcess();
					File file=new File(Environment.getExternalStorageDirectory()+"//STS//personalImage//"+String.valueOf(personalDataForm.getPersonelID())+".png");

					if(file.exists()){
						Bitmap bitmap=fileProcess.readImageFromFile(file);
						BitmapDrawable bitmapDrawable=new BitmapDrawable(getResources(), bitmap);
						personalImage.setBackground(bitmapDrawable);
					}

				}
				return convertView;
			}
			
			public int getCount(){
				return arrayList.size();
			}
			
			public void notifyDataSetChanged(){
				super.notifyDataSetChanged();
				this.arrayList=personalDataFormList;
			}
			
			/**
			 * Verilecek olan bir byte dizisinden yine verilecek olan görsel formata göre işlenip söz konusu görsel öğenin elde edilmesini sağlamak amacıyla
			 * kullanılacak olan uygulamadır.
			 */
			public Drawable convert(byte[] imageByte){
				if (imageByte != null) {
	                ByteArrayInputStream imageStream = new ByteArrayInputStream(imageByte);
	                Bitmap personalLogo = BitmapFactory.decodeStream(imageStream);
	    			return new BitmapDrawable(getResources(), personalLogo);
	            }
				return null;
			}
	 }
	
	
	public void updateGUI(ArrayList<PersonalDataForm> personalDataFormList) {	
		
		this.personalDataFormList=personalDataFormList;
		/*
		 * Bu bölümde personellere ait resim bilgileri dosyaya yazılıyor.
		 */
		FileProcess fileProcess=new FileProcess();
		
		File dirFile=new File(Environment.getExternalStorageDirectory()+"//STS//personalImage//");
		
		/**
		 * Burada klasörün var olup olmadığı kontrol ediliyor.Yoksa oluşturuluyor.
		 */
		if(!dirFile.exists()){
			dirFile.mkdirs();
		}
		
		/**
		 * Burada personel listesine tek tek bakılıyor ve her bir personee ait resim dosyaya kay�t ediliyor.
		 */
		for(int i=0;i<this.personalDataFormList.size();i++){
			File file=new File(Environment.getExternalStorageDirectory()+"//STS//personalImage//"+String.valueOf(this.personalDataFormList.get(i).getPersonelID())+".png");
			Bitmap bitmap=this.convertToBitmap(this.personalDataFormList.get(i).getPersonelImage());
			if(bitmap!=null){
				fileProcess.writeImageToFile(bitmap,file);
			}
		}
		
		myHandler.post(myRunnable);
	}

	
	/**
	 * Parametre olarak resme ait bir byte dizisi alır ve geriye Bitmap türünde bir resim dönderir.
	 * @param imageByte
	 * @return
	 */
	public Bitmap convertToBitmap(byte[] imageByte){
		if (imageByte != null) {
            ByteArrayInputStream imageStream = new ByteArrayInputStream(imageByte);
            Bitmap personalLogo = BitmapFactory.decodeStream(imageStream);
			return personalLogo;
        }
		return null;
	}

	

	@Override
	public void audioFileReady(String fileName) {
		// TODO Auto-generated method stub
		
	}
}
